package com.pe.pgn.clubpgn.dao.impl;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.HashMap;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.dao.DocumentoPagoEmpresaDao;
import com.pe.pgn.clubpgn.dao.hibernate.GenericDaoHibernate;
import com.pe.pgn.clubpgn.domain.ClpmDocumentoPagoEmpresa;
import com.pe.pgn.clubpgn.domain.ClpmSincronizacionFlota;
import com.pe.pgn.clubpgn.webapp.util.CalendarUtil;
import com.pe.pgn.clubpgn.domain.beans.BNClienteEmpresa;
import com.pe.pgn.clubpgn.domain.beans.BNTarjetaEmpresa;

import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;

@Repository("documentoPagoEmpresaDao")
public class DocumentoPagoEmpresaDaoImpl extends GenericDaoHibernate<ClpmDocumentoPagoEmpresa, Long> 
	implements DocumentoPagoEmpresaDao{

	private static Logger logger = Logger.getLogger(DocumentoPagoEmpresaDaoImpl.class);
	
	public DocumentoPagoEmpresaDaoImpl() {
		super(ClpmDocumentoPagoEmpresa.class);
	}
	

	private JdbcTemplate jdbcTemplate;

	@Autowired
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public List<ClpmDocumentoPagoEmpresa> obtenerDocumentoPagoEmpresas(ClpmDocumentoPagoEmpresa documentoPago, boolean esInicial) {
		
		if(StringUtils.isNotBlank(documentoPago.getFechaEmisionInicio())){
			try{
	        	CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, documentoPago.getFechaEmisionInicio());
	        }catch(Exception e){
	        	//entra aca si el parametro dado no es una fecha
	        	documentoPago.setFechaEmisionInicio("");
	        }
		}
		
		if(StringUtils.isNotBlank(documentoPago.getFechaEmisionFin())){
			try{
	        	CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, documentoPago.getFechaEmisionFin());
	        }catch(Exception e){
	        	//entra aca si el parametro dado no es una fecha
	        	documentoPago.setFechaEmisionFin("");
	        }
		}
		
		if(StringUtils.isNotBlank(documentoPago.getFechaPagoInicio())){
			try{
	        	CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, documentoPago.getFechaPagoInicio());
	        }catch(Exception e){
	        	//entra aca si el parametro dado no es una fecha
	        	documentoPago.setFechaPagoInicio("");
	        }
		}
		
		if(StringUtils.isNotBlank(documentoPago.getFechaPagoFin())){
			try{
	        	CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, documentoPago.getFechaPagoFin());
	        }catch(Exception e){
	        	//entra aca si el parametro dado no es una fecha
	        	documentoPago.setFechaPagoFin("");
	        }
		}

		
		StringBuffer sql = new StringBuffer();

		sql.append(" SELECT documento.id as id, ");
		sql.append(" 		documento.CO_CLIENTE_EMPRESA as coClienteEmpresa, ");
		sql.append(" 		empresa.DE_CLIENTE_EMPRESA as deClienteEmpresa, ");
		sql.append(" 		documento.CO_FACTURA as coFactura , ");
		sql.append(" 		documento.va_descuento as vaDescuento,  ");
		sql.append(" 		documento.va_monto_amortiza_linea_cred as vaMontoAmortizaLineaCredito,  ");
		sql.append(" 		documento.va_monto_real_a_cobrar as vaMontoRealACobrar, ");
		sql.append(" 		to_char(documento.DA_FECHA_EMISION_FACTURA, 'dd/MM/yyyy') as fechaEmisionFactura, ");
		sql.append(" 		to_char(documento.DA_FECHA_PAGO_FACTURA, 'dd/MM/yyyy') as fechaPagoFactura, ");
		sql.append(" 		to_char(documento.DA_FECHA_REGISTRO_PAGO, 'dd/MM/yyyy') as fechaRegistroPagoFactura ");
		sql.append(" from clpm_documento_pago_empresa documento ");
		sql.append(" 		join CLPB_CLIENTE_EMPRESA empresa on empresa.id = documento.CO_CLIENTE_EMPRESA ");
		sql.append(" where 1=1 ");	
		
		if(esInicial){
			sql.append(" and 	documento.st_documento_pago_empresa ='"+CLPConstantes.ST_VERDADERO+"' ");
			sql.append(" order by  documento.id desc " );
			
			StringBuffer prequery = new StringBuffer();
			prequery.append(" select * from (").append(sql.toString()).append(") where rownum <= " + CLPConstantes.MAXIMO_RESULTADO_INICIAL);
			
			sql = new StringBuffer(prequery.toString());	
			
		}else{
			
			if(StringUtils.isNotBlank(documentoPago.getDeClienteEmpresa())){
				sql.append(" and upper(trim(empresa.de_cliente_empresa)) like upper(trim('%" + documentoPago.getDeClienteEmpresa()+ "%'))");
			}
			
			if(StringUtils.isNotBlank(documentoPago.getCoFactura())){
				sql.append(" and upper(trim(documento.co_factura)) like upper(trim('%" + documentoPago.getCoFactura()+ "%'))");
			}
			
			if(StringUtils.isNotBlank(documentoPago.getFechaEmisionInicio()) && StringUtils.isNotBlank(documentoPago.getFechaEmisionFin())){				
				sql.append(" and ( documento.da_fecha_emision_factura between to_date('"+documentoPago.getFechaEmisionInicio()+"', '"+CLPConstantes.DATE_PATTERN+"') and to_date('"+documentoPago.getFechaEmisionFin()+"', '"+CLPConstantes.DATE_PATTERN+"') ) ");
			}			
			else if(StringUtils.isNotBlank(documentoPago.getFechaEmisionInicio())) {
				
				sql.append(" and to_date(to_char(documento.da_fecha_emision_factura, 'dd/MM/yyyy'), 'dd/MM/yyyy') > to_date('");
				sql.append(documentoPago.getFechaEmisionInicio()).append("', 'dd/MM/yyyy')");
			}
			else if (StringUtils.isNotBlank(documentoPago.getFechaEmisionFin())){
				
				sql.append(" and to_date(to_char(documento.da_fecha_emision_factura, 'dd/MM/yyyy'), 'dd/MM/yyyy') < to_date('");
				sql.append(documentoPago.getFechaEmisionFin()).append("', 'dd/MM/yyyy')");
			}
			
			if(StringUtils.isNotBlank(documentoPago.getFechaPagoInicio()) && StringUtils.isNotBlank(documentoPago.getFechaPagoFin())){				
				sql.append(" and ( documento.da_fecha_pago_factura between to_date('"+documentoPago.getFechaPagoInicio()+"', '"+CLPConstantes.DATE_PATTERN+"') and to_date('"+documentoPago.getFechaPagoFin()+"', '"+CLPConstantes.DATE_PATTERN+"') ) ");
			}	
			else if(StringUtils.isNotBlank(documentoPago.getFechaPagoInicio())){
				
				sql.append(" and to_date(to_char(documento.da_fecha_pago_factura, 'dd/MM/yyyy'), 'dd/MM/yyyy') > to_date('");
				sql.append(documentoPago.getFechaPagoInicio()).append("', 'dd/MM/yyyy')");
			}
			else if(StringUtils.isNotBlank(documentoPago.getFechaPagoFin())){
					
				sql.append(" and to_date(to_char(documento.da_fecha_pago_factura, 'dd/MM/yyyy'), 'dd/MM/yyyy') < to_date('");
				sql.append(documentoPago.getFechaPagoFin()).append("', 'dd/MM/yyyy')");
			}
			
			sql.append("	order by  documento.id desc");
		}		
		return findListOfBeans(sql.toString(), null, ClpmDocumentoPagoEmpresa.class);
	}

	@Override
	public void guardarDocumentoPagoEmpresa(
			ClpmDocumentoPagoEmpresa documentoPago) {
		
			documentoPago.setStDocumentoPagoEmpresa(Boolean.TRUE);
			documentoPago.setDaFechaCreacion(Calendar.getInstance());
			documentoPago.setDaFechaRegistroPago(Calendar.getInstance());
			documentoPago.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
			getHibernateTemplate().saveOrUpdate(documentoPago);			
			
			//que este agregando//
			StringBuffer sql = new StringBuffer(); 
			sql.append(" update clpd_linea_credito  set  ");
			sql.append(" va_saldo_linea_credito = va_saldo_linea_credito + ").append(documentoPago.getVaMontoAmortizaLineaCredito()).append(" ,");
			sql.append(" co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("' ,");
			sql.append(" da_fecha_modificacion = sysdate");		
			sql.append(" where co_cliente_empresa = ").append(documentoPago.getClpbClienteEmpresa().getId());			
			logger.info(sql);
			jdbcTemplate.update(sql.toString());			
			
			
			
			BNClienteEmpresa bean=obtenerClienteEmpresa(documentoPago.getClpbClienteEmpresa().getId());
			
			String respuesta=verificarSiEsMenor(new BigDecimal(documentoPago.getClpbClienteEmpresa().getId()), 
					bean.getDeEmailNotificacion1(),bean.getDeEmailNotificacion2(), documentoPago.getClpbClienteEmpresa().getDeClienteEmpresa());
			
			if(respuesta.equalsIgnoreCase(CLPConstantes.ST_OK)){
				
				guardarSyncPorDocumentoPago(documentoPago);
				
			}else{
				
			String mensaje =  verificarTopesVerdeAmbar(new BigDecimal(documentoPago.getClpbClienteEmpresa().getId()), 
							bean.getDeEmailNotificacion1(),bean.getDeEmailNotificacion2(), documentoPago.getClpbClienteEmpresa().getDeClienteEmpresa());			

			Map<String, Object> map = verificarTopeRojo(new BigDecimal(documentoPago.getClpbClienteEmpresa().getId()), 
					bean.getDeEmailNotificacion1(),bean.getDeEmailNotificacion2(), documentoPago.getClpbClienteEmpresa().getDeClienteEmpresa());
			
			logger.info("7.1. verificarTopes map "+map);
	
			
			}
							
			getHibernateTemplate().flush();		
	}

	@Override
	public ClpmDocumentoPagoEmpresa obtenerDocumentoPagoEmpresa(Long id) {
		ClpmDocumentoPagoEmpresa documentoPago = get(id);		
		documentoPago.setFechaEmisionFactura(CalendarUtil.calendarToString(CLPConstantes.DATE_PATTERN, documentoPago.getDaFechaEmisionFactura()));
		documentoPago.setFechaPagoFactura(CalendarUtil.calendarToString(CLPConstantes.DATE_PATTERN, documentoPago.getDaFechaPagoFactura()));
		documentoPago.setFechaRegistroPagoFactura(CalendarUtil.calendarToString(CLPConstantes.DATE_PATTERN, documentoPago.getDaFechaRegistroPago()));
		return documentoPago;
	}
	
	//Funcionalidad Nueva
	
	private Map<String, Object> verificarTopeRojo(BigDecimal idClienteEmpresa,
			String deEmailNotificacion1, String deEmailNotificacion2,
			String deClienteEmpresa) {

		String mensaje = "";
		String flag = "";
		String indicador = CLPConstantes.ST_OK;	
		StringBuffer query  = new StringBuffer();
		Map<String, Object> map = new HashMap<String, Object>();
		
		query.append("select distinct ");
		query.append("		tp.id as id_tope, "); 
		query.append(" 		tp.va_porcentaje, tp.de_tope,");
		query.append("		lc.va_saldo_linea_credito, ");
		query.append("  	lc.va_linea_credito, tp.st_tipo_tope ");
		query.append(" 	from clpd_tope tp join clpd_linea_credito lc ");
		query.append(" 		on lc.co_cliente_empresa = tp.co_cliente_empresa ");
		query.append(" where tp.co_cliente_empresa = ").append(idClienteEmpresa);
		query.append(" 		and lc.st_linea_credito = '"+CLPConstantes.ST_VERDADERO+"'");
		query.append(" 		and tp.st_tope = '"+CLPConstantes.ST_VERDADERO+"'");		
		query.append(" 		and tp.st_tipo_tope = '"+CLPConstantes.ST_ROJO+"'");
		
		logger.info("Query  verificarTopeRojo: "+query);
		List<Map<String,Object>> list = jdbcTemplate.queryForList(query.toString());	
		if(!list.isEmpty()){
				
			//frk: siempre solo va existir un tope rojo
			Map<String, Object> objMap = list.get(0);
			String deTope = objMap.get("DE_TOPE").toString();
			String tipoTope = objMap.get("ST_TIPO_TOPE").toString();
			String idTope = String.valueOf(objMap.get("ID_TOPE"));
			double porcentaje = Double.parseDouble(objMap.get("VA_PORCENTAJE").toString());
			double lineacredito = Double.parseDouble(objMap.get("VA_LINEA_CREDITO").toString());
			double saldo_lineacredito = Double.parseDouble(objMap.get("VA_SALDO_LINEA_CREDITO").toString());
			
			double cantidadtope = (porcentaje * lineacredito) / 100;
			double cantconsumida = lineacredito - saldo_lineacredito;
			
			if(cantconsumida >= cantidadtope){
				
				indicador = CLPConstantes.ST_ERROR;
				flag=CLPConstantes.ST_VERDADERO;
				updateEnviadoTope(idTope, flag);				
				mensaje   = "La cantidad consumida es mayor o igual al tope "+deTope+", "+ 
							"se bloquearan las tarjetas del cliente con id="+idClienteEmpresa+"./";	
				
				flag=CLPConstantes.ACTIVO;
				mensaje += updateTarjetasBloqueadasByIDClienteEmpresa(idClienteEmpresa, flag);
				enviarNotificacionTope(deEmailNotificacion1,deEmailNotificacion2, deClienteEmpresa,porcentaje,tipoTope,deTope,cantidadtope);	
				mensaje += updateSyncPorTarjetasBloqueadas(idClienteEmpresa);
			}				
		}
		
		map.put("indicador", indicador);
		map.put("mensaje", mensaje);
		return map;
	}
	
	public String verificarTopesVerdeAmbar(BigDecimal idClienteEmpresa, String deEmailNotificacion1, String deEmailNotificacion2,
			String deClienteEmpresa) {

		String mensaje = "";
		String flag    = "";
		StringBuffer query  = new StringBuffer();
		query.append(" select distinct ");
		query.append(" 	tp.id as id_tope, tp.va_porcentaje, ");
		query.append("  tp.de_tope, lc.va_saldo_linea_credito, ");
		query.append("  lc.va_linea_credito, tp.st_tipo_tope, tp.st_enviado, te.st_bloqueado ");
		query.append(" from clpd_tope tp ");
		query.append(" join clpd_linea_credito lc ");
		query.append(" on lc.co_cliente_empresa = tp.co_cliente_empresa ");
		query.append(" JOIN clpb_cliente_empresa ce  ");
		query.append(" ON lc.co_cliente_empresa = ce.id  ");
		query.append(" JOIN clpd_flota f  ");
		query.append(" ON f.co_cliente_empresa=ce.id  ");
		query.append(" JOIN clpr_flota_vehiculo fv  ");
		query.append(" ON fv.co_flota = f.id  ");
		query.append(" JOIN clpb_tarjeta_empresa te  ");
		query.append(" ON fv.co_tarjeta_empresa    = te.id and te.co_flota_vehiculo = fv.id  ");
		query.append(" where tp.co_cliente_empresa = ").append(idClienteEmpresa);
		query.append(" and lc.st_linea_credito = '"+CLPConstantes.ST_VERDADERO+"'");
		query.append(" and tp.st_tope = '"+CLPConstantes.ST_VERDADERO+"'");		
		query.append(" and tp.st_tipo_tope != '"+CLPConstantes.ST_ROJO+"'");
		query.append(" order by tp.va_porcentaje desc ");
		
		logger.info("Query  verificarTopesVerdeAmbar: "+query);
		List<Map<String,Object>> list =jdbcTemplate.queryForList(query.toString());
		if(!list.isEmpty()){
			for (int j = 0; j < list.size(); j++) {
				
				Map<String, Object> objMap = list.get(j);
				String deTope = objMap.get("DE_TOPE").toString();
				String tipoTope = objMap.get("ST_TIPO_TOPE").toString();
				String st_bloqueado=objMap.get("ST_BLOQUEADO").toString();
				String idTope = String.valueOf(objMap.get("ID_TOPE"));
				String stEnviado = String.valueOf(objMap.get("ST_ENVIADO"));
				double porcentaje = Double.parseDouble(objMap.get("VA_PORCENTAJE").toString());
				double lineacredito = Double.parseDouble(objMap.get("VA_LINEA_CREDITO").toString());
				double saldo_lineacredito = Double.parseDouble(objMap.get("VA_SALDO_LINEA_CREDITO").toString());
				
				double cantidadtope = (porcentaje * lineacredito) / 100;
				double cantconsumida = lineacredito - saldo_lineacredito;
				
				if(stEnviado.equals("null") || stEnviado.equals("")){					
					stEnviado = CLPConstantes.ST_FALSO;				
				}else if(stEnviado == CLPConstantes.ST_VERDADERO){
					break;
				}
				
				if(cantconsumida >= cantidadtope && stEnviado.equalsIgnoreCase(CLPConstantes.ST_FALSO) ){
					flag=CLPConstantes.ST_VERDADERO;
					updateEnviadoTope(idTope,flag);					
					mensaje = " / La cantidad consumida es mayor o igual al tope "+deTope;				
					enviarNotificacionTope(deEmailNotificacion1,deEmailNotificacion2,
					deClienteEmpresa,porcentaje,tipoTope,deTope,cantidadtope);

					if(st_bloqueado.equalsIgnoreCase(CLPConstantes.ST_VERDADERO)){
						flag=CLPConstantes.NO_ACTIVO;
						updateTarjetasBloqueadasByIDClienteEmpresa(idClienteEmpresa, flag);	
					}
					break;
				}
			}
		}
		
		return mensaje;
	}
	
	
	public String verificarSiEsMenor(BigDecimal idClienteEmpresa, String deEmailNotificacion1, String deEmailNotificacion2,
			String deClienteEmpresa) {

		String mensaje = "";
		String flag = "";
		int conta=0;
		StringBuffer query  = new StringBuffer();
		query.append(" select distinct ");
		query.append(" 	tp.id as id_tope, tp.va_porcentaje, ");
		query.append("  tp.de_tope, lc.va_saldo_linea_credito, ");
		query.append("  lc.va_linea_credito, tp.st_tipo_tope, tp.st_enviado, te.st_bloqueado ");
		query.append(" from clpd_tope tp ");
		query.append(" join clpd_linea_credito lc ");
		query.append(" on lc.co_cliente_empresa = tp.co_cliente_empresa ");
		query.append(" JOIN clpb_cliente_empresa ce  ");
		query.append(" ON lc.co_cliente_empresa = ce.id  ");
		query.append(" JOIN clpd_flota f  ");
		query.append(" ON f.co_cliente_empresa=ce.id  ");
		query.append(" JOIN clpr_flota_vehiculo fv  ");
		query.append(" ON fv.co_flota = f.id  ");
		query.append(" JOIN clpb_tarjeta_empresa te  ");
		query.append(" ON fv.co_tarjeta_empresa    = te.id  and te.co_flota_vehiculo = fv.id ");
		query.append(" where tp.co_cliente_empresa = ").append(idClienteEmpresa);
		query.append(" and lc.st_linea_credito = '"+CLPConstantes.ST_VERDADERO+"'");
		query.append(" and tp.st_tope = '"+CLPConstantes.ST_VERDADERO+"'");		
		query.append(" order by tp.va_porcentaje desc ");
		
		logger.info("Query  verificarSiEsMenor: "+query);
		List<Map<String,Object>> list =jdbcTemplate.queryForList(query.toString());
		if(!list.isEmpty()){
			for (int j = 0; j < list.size(); j++) {
				conta++;
				Map<String, Object> objMap = list.get(j);
				String deTope = objMap.get("DE_TOPE").toString();
				String tipoTope = objMap.get("ST_TIPO_TOPE").toString();
				String st_bloqueado=objMap.get("ST_BLOQUEADO").toString();
				String idTope = String.valueOf(objMap.get("ID_TOPE"));
				String stEnviado = String.valueOf(objMap.get("ST_ENVIADO"));
				double porcentaje = Double.parseDouble(objMap.get("VA_PORCENTAJE").toString());
				double lineacredito = Double.parseDouble(objMap.get("VA_LINEA_CREDITO").toString());
				double saldo_lineacredito = Double.parseDouble(objMap.get("VA_SALDO_LINEA_CREDITO").toString());
				
				double cantidadtope = (porcentaje * lineacredito) / 100;
				double cantconsumida = lineacredito - saldo_lineacredito;
				
				if(stEnviado.equals("null") || stEnviado.equals("")){					
					stEnviado = CLPConstantes.ST_FALSO;				
				}else if(stEnviado == CLPConstantes.ST_VERDADERO){
					break;
				}
				
				if(cantconsumida <= cantidadtope){

					mensaje=CLPConstantes.ST_OK;
					 flag=CLPConstantes.ST_FALSO; 
					updateEnviadoTope(idTope,flag);	

					if(st_bloqueado.equalsIgnoreCase(CLPConstantes.ST_VERDADERO)){
						flag=CLPConstantes.NO_ACTIVO;
						updateTarjetasBloqueadasByIDClienteEmpresa(idClienteEmpresa, flag);	
					}
					
				}else{
					mensaje="";
					break;
					
				}
			}
		}
		
		return mensaje;
	}

	
	private void updateEnviadoTope(String idTope, String flag) {
		StringBuffer query  = new StringBuffer();
		try {
			query.append(" update clpd_tope ");
			if(flag.equalsIgnoreCase(CLPConstantes.ST_VERDADERO)){
				query.append(" set st_enviado = '").append(CLPConstantes.ST_VERDADERO).append("', ");
			}else{
				query.append(" set st_enviado = '").append(CLPConstantes.ST_FALSO).append("', ");
			}
			query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("'");
			query.append(" ,da_fecha_modificacion  =  sysdate ");
			query.append(" where id = ").append(idTope);
			
			logger.info("Query  update updateEnviadoTope: "+query);
			jdbcTemplate.update(query.toString());
		} catch (Exception e) {
			logger.error("El query " + query.toString() + " ha fallado " + e.getMessage());
		}
	}

	private void enviarNotificacionTope(String deEmailNotificacion1,
			String deEmailNotificacion2, String deClienteEmpresa,
			double porcentaje, String tipoTope, String deTope,
			double cantidadtope) {

		try{
		
			SimpleJdbcCall spEnviarNotificacion = new SimpleJdbcCall(jdbcTemplate)
								.withProcedureName("SP_ENVIAR_NOTIFICACION");
			
			Map<String, Object> parametrosIngresoMap = new HashMap<String, Object>();
			parametrosIngresoMap.put("mailnotificacion1", deEmailNotificacion1);
			parametrosIngresoMap.put("mailnotificacion2", deEmailNotificacion2);
			parametrosIngresoMap.put("declienteempresa", deClienteEmpresa);
			parametrosIngresoMap.put("porcentajetope", porcentaje);
			parametrosIngresoMap.put("cantidadtope", cantidadtope);
			parametrosIngresoMap.put("sttipotope", tipoTope);			
			parametrosIngresoMap.put("detope", deTope);
			
			SqlParameterSource parametrosIngreso = new MapSqlParameterSource().
			addValues(parametrosIngresoMap);
			
			spEnviarNotificacion.execute(parametrosIngreso);	
			
		} catch (Exception e) {
			logger.info("Error enviarNotificacionTope: " +e.getMessage());
		}
	}
	@SuppressWarnings("unchecked")
	private String updateSyncPorTarjetasBloqueadas(BigDecimal coClienteEmpresa) {

		try{
		
			StringBuffer query = new StringBuffer();
			query.append(" select ");
			query.append(" 	fv.de_placa as dePlaca, te.co_codigo_tarjeta_empresa as coCodigoTarjetaEmpresa, ");
			query.append(" 	f.co_cliente_empresa as coClienteEmpresa, e.co_codigo_cofide as coCodigoEstacionCofide ");
			query.append(" from clpr_flota_vehiculo fv ");
			query.append(" join clpb_tarjeta_empresa te on fv.co_tarjeta_empresa = te.id "); 
			query.append(" join clpd_flota f on fv.co_flota = f.id ");
			query.append(" join clpb_cliente_empresa ce on f.co_cliente_empresa = ce.id "); 
			query.append(" join clpr_cliente_estacion ces on ce.id = ces.co_cliente_empresa "); 
			query.append(" join clpb_estacion e on ces.co_estacion = e.id  ");
			query.append(" where ce.id = ").append(coClienteEmpresa);			
			query.append(" and ces.st_cliente_estacion = '").append(CLPConstantes.ST_VERDADERO).append("'");
			query.append(" and te.st_tarjeta_empresa = '").append(CLPConstantes.ST_VERDADERO).append("'");
			query.append(" and fv.st_flota_vehiculo = '").append(CLPConstantes.ST_VERDADERO).append("'");
			query.append(" and e.st_estacion = '").append(CLPConstantes.ST_VERDADERO).append("'");
			query.append(" and f.st_flota = '").append(CLPConstantes.ST_VERDADERO).append("'");
			query.append(" and ce.st_cliente_empresa = '").append(CLPConstantes.ST_VERDADERO).append("'");
			query.append(" and te.st_bloqueado = '").append(CLPConstantes.ST_FALSO).append("'");
			
			logger.info("Query   select updateSyncPorTarjetasBloqueadas: "+query);
			List<BNTarjetaEmpresa> list = findListOfBeans(query.toString(), null, BNTarjetaEmpresa.class);
			String[] arrayString = new String[list.size()];
			
			if(!list.isEmpty()){
				
				String stIndicadorDespacho = CLPConstantes.ST_FALSO;
				for (int i = 0; i < list.size(); i++) {
					
					BNTarjetaEmpresa tarjetaEmpresa = list.get(i);
					String coCodigoTarjetaEmpresa = tarjetaEmpresa.getCoCodigoTarjetaEmpresa();
					String coCodigoCofide = tarjetaEmpresa.getCoCodigoEstacionCofide();
					String dePlaca = tarjetaEmpresa.getDePlaca();
					
					Long idSync = existeRegistro(dePlaca, coCodigoTarjetaEmpresa, 
					coClienteEmpresa.toString(), coCodigoCofide);
						
					if(idSync != null){
						
						query = new StringBuffer();
						query.append(" update clpm_sincronizacion_flota ");
						query.append(" set ");
						query.append("     st_indicador_despacho   = '").append(stIndicadorDespacho).append("',");
						query.append("     da_fecha_sincronizacion = sysdate ");
						query.append(" where id = ").append(idSync);
						
						
						logger.info("Query  update clpm_sincronizacion_flota: "+query);
					}else{
						
						query = new StringBuffer();
						query.append(" insert into clpm_sincronizacion_flota (");
						query.append("		id, ");
						query.append("		co_cliente_empresa, ");
						query.append("		co_codigo_cofide, ");
						query.append("		co_codigo_tarjeta_empresa, ");
						query.append("		da_fecha_sincronizacion,");
						query.append("		de_placa,");
						query.append("		st_indicador_despacho");
						query.append(" ) values (");		
						query.append(" SEQ_SINCRONIZACION_FLOTA.nextVal, ");
						query.append("	'").append(coClienteEmpresa).append("', ");
						query.append("	'").append(coCodigoCofide).append("', ");
						query.append("	'").append(coCodigoTarjetaEmpresa).append("', ");
						query.append("	sysdate, ");
						query.append("	'").append(dePlaca).append("', ");
						query.append("	'").append(stIndicadorDespacho).append("' ) ");
						
						
						logger.info("Query  insert clpm_sincronizacion_flota: "+query);
					}
					
					arrayString[i] = query.toString();
				}
				
				jdbcTemplate.batchUpdate(arrayString);
			}
			
			return "";
			
		}catch(Exception e){
			return "/ Hubo un error al sincronizar: "+e.getCause().toString()+" /";
		}
	}
	
	@SuppressWarnings("unchecked")
	private Long existeRegistro(String dePlaca, String coCodigoTarjetaEmpresa, 
			String coClienteEmpresa, String coCodigoCofide) {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" id ");
		query.append(" from clpm_sincronizacion_flota ");
		query.append(" where de_placa = '").append(dePlaca).append("'");
		query.append(" and co_codigo_cofide = '").append(coCodigoCofide).append("'");
		query.append(" and co_cliente_empresa = '").append(coClienteEmpresa).append("'");
		query.append(" and co_codigo_tarjeta_empresa = '").append(coCodigoTarjetaEmpresa).append("'");
		logger.info("Query existeRegistro: "+query);
		List<Map<String,Object>> list = jdbcTemplate.queryForList(query.toString());
		if(!list.isEmpty()){
			
			Map<String,Object> map = list.get(0);
			return new Long(map.get("ID").toString());			
		}
		
		return null;
	}
	
	@SuppressWarnings("unchecked")
	private String updateTarjetasBloqueadasByIDClienteEmpresa(
			BigDecimal idClienteEmpresa, String flag) {

		try{
		
			StringBuffer query = new StringBuffer();
			query.append(" select distinct ");
			query.append(" fv.id ");
			query.append(" from clpr_flota_vehiculo fv ");
			query.append(" join clpd_flota f on fv.co_flota = f.id  ");
			query.append(" join clpb_cliente_empresa ce on f.co_cliente_empresa = ce.id  ");
			query.append(" where f.co_cliente_empresa  = ").append(idClienteEmpresa);
			query.append(" and ce.st_cliente_empresa = '").append(CLPConstantes.ST_VERDADERO).append("' ");
			query.append(" and fv.st_flota_vehiculo = '").append(CLPConstantes.ST_VERDADERO).append("' ");
			query.append(" and f.st_flota = '").append(CLPConstantes.ST_VERDADERO).append("' ");		
			String strCodesFlota  = "";
			logger.info("Query UpdateTarjetaBloqueada: "+query);
			List<BigDecimal> list = jdbcTemplate.queryForList(query.toString(), BigDecimal.class);
			if(!list.isEmpty()){
				for (int i = 0; i < list.size(); i++) {
					strCodesFlota = strCodesFlota + list.get(i) + ",";							
				}
				
				strCodesFlota = strCodesFlota.substring(0, strCodesFlota.length()-1);
				
				query  = new StringBuffer();
				query.append(" update clpb_tarjeta_empresa ");
				
				if(flag.equals(CLPConstantes.ACTIVO)){
				query.append(" set st_bloqueado = '").append(CLPConstantes.ST_VERDADERO).append("'");
				}else{
				query.append(" set st_bloqueado = '").append(CLPConstantes.ST_FALSO).append("'");
				}
				query.append(" where co_flota_vehiculo in (").append(strCodesFlota).append(")");
				query.append(" and st_tarjeta_empresa  = '").append(CLPConstantes.ST_VERDADERO).append("'");
				logger.info("Query clpb_tarjeta_empresa/St_bloqueado: "+query);
				jdbcTemplate.update(query.toString());
			}
			
			return "";
			
		}catch(Exception e){
			
			return "/ Hubo un error al bloquear las tarjetas: "+e.getCause().toString()+" /";
		}
	}
	
	
	public BNClienteEmpresa obtenerClienteEmpresa(
			Long co_cliente_empresa) {
		
	try{
		
		StringBuffer query= new  StringBuffer();
		query.append(" select ");
		query.append(" ce.id as co_cliente_empresa, ");
		query.append(" ce.de_cliente_empresa as de_cliente_empresa, ");
		query.append(" ce.co_ruc as ruc, ");
		query.append(" ce.st_red_total as activacion_red, ");
		query.append(" ce.de_email_notificacion_1 as deEmailNotificacion1, ");
		query.append(" ce.de_email_notificacion_2 as deEmailNotificacion2");
		query.append(" from clpb_cliente_empresa ce ");
		query.append(" where");
		query.append(" ce.id=").append(co_cliente_empresa);
		query.append(" and ce.st_cliente_empresa='").append(CLPConstantes.ST_VERDADERO).append("'");
		
		
		logger.info("ObtenerClienteEmpresa "+query.toString());
		
		List<BNClienteEmpresa>list=findListOfBeans(query.toString(),null,BNClienteEmpresa.class);

		if(!list.isEmpty()){
			return (BNClienteEmpresa) list.get(0);
		}
		
		return null;
		
	} catch (Exception e) {		
		logger.info("Error error en Obtencion del Cliente: " +e.getMessage());
	}
	return null;
	}

	 
	public void guardarSyncPorDocumentoPago(ClpmDocumentoPagoEmpresa documentoPago) {

		try{
		
			Long coClienteEmpresa = documentoPago.getClpbClienteEmpresa().getId();
			if(coClienteEmpresa != null){
			
				StringBuffer query = new StringBuffer();
				query.append(" select ");
				query.append(" 		fv.de_placa as dePlaca, te.co_codigo_tarjeta_empresa as coCodigoTarjetaEmpresa, ");
				query.append(" 		f.co_cliente_empresa as coClienteEmpresa, e.co_codigo_cofide as coCodigoEstacionCofide ");
				query.append(" from clpr_flota_vehiculo fv join clpb_tarjeta_empresa te on fv.co_tarjeta_empresa = te.id "); 
				query.append(" 		join clpd_flota f on fv.co_flota = f.id ");
				query.append(" 		join clpb_cliente_empresa ce on f.co_cliente_empresa = ce.id "); 
				query.append(" 		join clpr_cliente_estacion ces on ce.id = ces.co_cliente_empresa "); 
				query.append(" 		join clpb_estacion e on ces.co_estacion = e.id  ");
				query.append(" where ce.id = ").append(coClienteEmpresa);			
				query.append(" 		and ces.st_cliente_estacion = '").append(CLPConstantes.ST_VERDADERO).append("'");
				query.append(" 		and te.st_tarjeta_empresa = '").append(CLPConstantes.ST_VERDADERO).append("'");
				query.append(" 		and fv.st_flota_vehiculo = '").append(CLPConstantes.ST_VERDADERO).append("'");
				query.append(" 		and e.st_estacion = '").append(CLPConstantes.ST_VERDADERO).append("'");
				query.append(" 		and f.st_flota = '").append(CLPConstantes.ST_VERDADERO).append("'");
				query.append("		and f.st_cuota = '").append(CLPConstantes.ST_FALSO).append("'");
				query.append(" 		and ce.st_cliente_empresa = '").append(CLPConstantes.ST_VERDADERO).append("'");
				query.append(" 		and te.st_bloqueado = '").append(CLPConstantes.ST_FALSO).append("'");
				
				logger.info("Query guardarSyncPorDocumentoPago: "+query);
				
				List<ClpmSincronizacionFlota> listaClpmSincronizacionFlota = new ArrayList<ClpmSincronizacionFlota>();
				List<BNTarjetaEmpresa> list = findListOfBeans(query.toString(), null, BNTarjetaEmpresa.class);
				
				if(!list.isEmpty()){
					
					String stIndicadorDespacho = CLPConstantes.ST_VERDADERO;
					for (BNTarjetaEmpresa tarjetaEmpresa : list) {

						String coCodigoTarjetaEmpresa = tarjetaEmpresa.getCoCodigoTarjetaEmpresa();
						String coCodigoCofide 	 = tarjetaEmpresa.getCoCodigoEstacionCofide();
						String dePlaca 			 = tarjetaEmpresa.getDePlaca();
						
						Long idSync = existeRegistro(dePlaca, coCodigoTarjetaEmpresa, 
						coClienteEmpresa.toString(), coCodigoCofide);
							
						ClpmSincronizacionFlota clpmSincronizacionFlota = new ClpmSincronizacionFlota();
						clpmSincronizacionFlota.setCoCodigoTarjetaEmpresa(coCodigoTarjetaEmpresa);
						clpmSincronizacionFlota.setDaFechaSincronizacion(Calendar.getInstance());
						clpmSincronizacionFlota.setStIndicadorDespacho(stIndicadorDespacho);
						clpmSincronizacionFlota.setCoClienteEmpresa(coClienteEmpresa.toString());
						clpmSincronizacionFlota.setCoCodigoCofide(coCodigoCofide);					
						clpmSincronizacionFlota.setDePlaca(dePlaca);
						
						if(idSync != null){
							clpmSincronizacionFlota.setId(idSync);
						}
						
						listaClpmSincronizacionFlota.add(clpmSincronizacionFlota);				
					}
					
					getHibernateTemplate().saveOrUpdateAll(listaClpmSincronizacionFlota);
					getHibernateTemplate().flush();
				}
			}
			
		}catch(Exception e){
			System.out.println("* guardarSyncPorDocumentoPago() Excepcion Message: "+e.getMessage());
			System.out.println("* guardarSyncPorDocumentoPago() Excepcion Causa: "+e.getCause());
		}
	}
	
}